<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>员工列表</title>
<%
	pageContext.setAttribute("APP_PATH", request.getContextPath());
%>
<!-- web路径：
不以/开始的相对路径，找资源，以当前资源的路径为基准，经常容易出现问题
以/开始的相当路径，找资源，以服务器的路径为标准：(http://localhost:3306):需要加上项目名
		http://localhost:3306/crud
		
 -->
<script src="${APP_PATH}/static/js/jquery-3.1.1.min.js"></script>
<link rel="stylesheet"
	href="${APP_PATH}/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
<script
	src="${APP_PATH}/static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
</head>
<body>
	<!-- Modal模态框，Bootstrap,员工修改 -->
	<div class="modal fade" id="empUpdateModel" tabindex="-1" role="dialog"
		aria-labelledby="myModalLabel">
		<div class="modal-dialog" role="document">
			<div class="modal-content">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal"
						aria-label="Close">
						<span aria-hidden="true">&times;</span>
					</button>
					<h4 class="modal-title" >员工修改</h4>
				</div>
				<div class="modal-body">
					<!-- 可参照全局css样式 -->
					<!-- empName -->
					<form class="form-horizontal">
						<div class="form-group">
							<label class="col-sm-2 control-label">empName</label>
							<div class="col-sm-10">
								<p class="form-control-static" id="empName_update_static"></p>
									<span class="help-block"></span>
							</div>
						</div>
						<!-- email -->
						<div class="form-group">
							<label class="col-sm-2 control-label">email</label>
							<div class="col-sm-10">
								<input type="text" name="email" class="form-control"
									id="email_update_input" placeholder="email@atguigu.com">
									<span class="help-block"></span>
							</div>
						</div>
						<!-- gender -->
						<div class="form-group">
							<label class="col-sm-2 control-label">gender</label> 
							<div class="col-sm-10">
							<label class="radio-inline"> 
								<input type="radio" name="gender" id="gender1_update_input" value="M" checked="checked"> 男
							</label> 
							<label class="radio-inline"> 
								<input type="radio" name="gender" id="gender2_update_input" value="F"> 女
							</label>
							</div>
						</div>
						<!-- 部门 -->
						<div class="form-group">
							<label class="col-sm-2 control-label">deptName</label>
							<div class="col-sm-4"> 
								<!-- 提交部门id既可 -->
								<select class="form-control" name="dId">
								
								</select>
							</div>
						</div>
					</form>
				</div>
				<div class="modal-footer">
					<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
					<button type="button" class="btn btn-primary" id="emp_update_btn">更新</button>
				</div>
			</div>
		</div>
	</div>
	


	<!-- Modal模态框，Bootstrap,员工添加 -->
	<div class="modal fade" id="empAddModel" tabindex="-1" role="dialog"
		aria-labelledby="myModalLabel">
		<div class="modal-dialog" role="document">
			<div class="modal-content">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal"
						aria-label="Close">
						<span aria-hidden="true">&times;</span>
					</button>
					<h4 class="modal-title" id="myModalLabel">员工添加</h4>
				</div>
				<div class="modal-body">
					<!-- 可参照全局css样式 -->
					<!-- empName -->
					<form class="form-horizontal">
						<div class="form-group">
							<label class="col-sm-2 control-label">empName</label>
							<div class="col-sm-10">
								<input type="text" name="empName" class="form-control"
									id="empName_add_input" placeholder="empName">
									<span class="help-block"></span>
							</div>
						</div>
						<!-- email -->
						<div class="form-group">
							<label class="col-sm-2 control-label">email</label>
							<div class="col-sm-10">
								<input type="text" name="email" class="form-control"
									id="email_add_input" placeholder="email@atguigu.com">
									<span class="help-block"></span>
							</div>
						</div>
						<!-- gender -->
						<div class="form-group">
							<label class="col-sm-2 control-label">gender</label> 
							<div class="col-sm-10">
							<label class="radio-inline"> 
								<input type="radio" name="gender" id="gender1_add_input" value="M" checked="checked"> 男
							</label> 
							<label class="radio-inline"> 
								<input type="radio" name="gender" id="gender2_add_input" value="F"> 女
							</label>
							</div>
						</div>
						<!-- 部门 -->
						<div class="form-group">
							<label class="col-sm-2 control-label">deptName</label>
							<div class="col-sm-4"> 
								<!-- 提交部门id既可 -->
								<select class="form-control" name="dId" id="dept_add_select">
								
								</select>
							</div>
						</div>
					</form>
				</div>
				<div class="modal-footer">
					<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
					<button type="button" class="btn btn-primary" id="emp_save_btn">保存</button>
				</div>
			</div>
		</div>
	</div>




	<!-- 搭建显示页面 -->
	<div class="container">
		<!-- 标题行 -->
		<div class="row">
			<div class="col-xs-12">
				<h1>SSM-CRUD</h1>
			</div>
		</div>
		<!-- 按钮 -->
		<div class="row">
			<div class="col-md-4 col-md-offset-8">
				<button class="btn btn-primary" id="emp_add_model_btn">新增</button>
				<button class="btn btn-danger" id="emp_delete_all_btn">删除</button>
			</div>
		</div>
		<!-- 显示表格数据 -->
		<div class="row">
			<div class="col-md-12">
				<table class="table table-hover" id="emps_table">
					<!-- thead为表格头 -->
					<thead>
						<tr>
							<th>
								<input type="checkbox" id="check_all" />
							</th>
							<th>#</th>
							<th>empName</th>
							<th>gender</th>
							<th>email</th>
							<th>departName</th>
							<th>操作</th>
						</tr>
					</thead>
					<!-- 表格体 -->
					<tbody>

					</tbody>
				</table>
			</div>
		</div>
		<!-- 分页信息 -->
		<div class="row">
			<!-- 分页文字信息 -->
			<div class="col-md-6" id="page_info_area">当前 页,总 页,总条记录</div>
			<!-- 分页条信息 -->
			<div class="col-md-6" id="page_nav_area"></div>
		</div>
	</div>

	<script type="text/javascript">
		//全局变量
		var totalRecord,currentPage;
		
		//1.页面加载完成以后，直接去发送ajax请求，要到分页数据
		$(function() {

			//去首页
			to_page(1);

		});

		function to_page(pn) {
			$.ajax({
				url : "${APP_PATH}/emps",
				data : "pn=" + pn,
				type : "GET",
				success : function(result) {
					//console.log(result);
					//1.解析并显示员工数据
					build_emps_table(result);
					//2.解析并显示分页信息
					buile_page_info(result);
					//3.解析显示分页条信息
					build_page_nav(result);
				}
			});
		}

		function build_emps_table(result) {
			//清空table表格
			$("#emps_table tbody").empty();

			var emps = result.extend.pageInfo.list;
			//jq遍历
			$.each(emps, function(index, item) {
				//创建单元格
				var checkBoxTd = $("<td><input type='checkbox' class='check_item'/></td>")
				var empIdTd = $("<td></td>").append(item.empId);
				var empNameTd = $("<td></td>").append(item.empName);
				var genderTd = $("<td></td>").append(
						item.gender == 'M' ? "男" : "女");
				var emailTd = $("<td></td>").append(item.email);
				var deptNameTd = $("<td></td>")
						.append(item.department.deptName);
				/*
				<button class="btn btn-primary btn-sm">
									<span class="glyphicon glyphicon-pencil" aria-hidden="true">
										编辑 </span>
								</button>
				 */
				/*
				addClass() 方法向被选元素添加一个或多个类。$(selector).addClass(class)
				 */
				var editBtn = $("<button></button>").addClass("btn btn-primary btn-sm edit_btn")
				.append($("<span></span>").addClass("glyphicon glyphicon-pencil")).append("编辑");
				 //为编辑按钮添加一个自定义的属性，来表示当前员工id
				 editBtn.attr("edit-id",item.empId);
				/*
				<button class="btn btn-danger btn-sm">
									<span class="glyphicon glyphicon-trash" aria-hidden="true">
										删除 </span>
								</button>
				 */
				var delBtn = $("<button></button>").addClass("btn btn-danger btn-sm delete_btn").append(
						$("<span></span>").addClass("glyphicon glyphicon-trash")).append("删除");
				 //为删除按钮添加自定义属性来表示当前删除的员工id
				 delBtn.attr("del-id",item.empId);
				var btnTd = $("<td></td>").append(editBtn).append(" ").append(
						delBtn);
				//append()方法执行完成后还是会返回原来的元素
				$("<tr></tr>").append(checkBoxTd)
						.append(empIdTd)
						.append(empNameTd)
						.append(genderTd)
						.append(emailTd)
						.append(deptNameTd)
						.append(btnTd)
				//appendTo添加到某个位置
				.appendTo("#emps_table tbody");
			});
		}
		//解析显示分页信息（左）
		function buile_page_info(result) {
			//清空数据
			$("#page_info_area").empty();

			$("#page_info_area").append(
					"当前" + result.extend.pageInfo.pageNum + "页,总"
							+ result.extend.pageInfo.pages + "页,总"
							+ result.extend.pageInfo.total + "条记录");
			totalRecord=result.extend.pageInfo.total;
			currentPage=result.extend.pageInfo.pageNum;
		}
		//解析显示分页条,点击分页要能去下一页。。。。。
		function build_page_nav(result) {
			$("#page_nav_area").empty();

			var ul = $("<ul></ul>").addClass("pagination");

			//构建元素
			var firstPageLi = $("<li></li>").append(
					$("<a></a>").append("首页").attr("href", "#"));
			var prePageLi = $("<li></li>").append(
					$("<a></a>").append("&laquo;"));
			//判断首页与前一页是否有前一页，如果没有则不能选
			if (result.extend.pageInfo.hasPreviousPage == false) {
				firstPageLi.addClass("disabled");
				prePageLi.addClass("disabled");
			} else {
				//为元素添加点击翻页的事件
				firstPageLi.click(function() {
					to_page(1);
				});
				prePageLi.click(function() {
					to_page(result.extend.pageInfo.pageNum - 1);
				});
			}

			var nextPageLi = $("<li></li>").append(
					$("<a></a>").append("&raquo;"));
			var lastPageLi = $("<li></li>").append(
					$("<a></a>").append("末页").attr("href", "#"));

			if (result.extend.pageInfo.hasNextPage == false) {
				nextPageLi.addClass("disabled");
				lastPageLi.addClass("disabled");
			} else {
				//为元素添加点击翻页的事件
				nextPageLi.click(function() {
					to_page(result.extend.pageInfo.pageNum + 1);
				});
				lastPageLi.click(function() {
					to_page(result.extend.pageInfo.pages);
				})
			}

			//添加首页和前一页
			ul.append(firstPageLi).append(prePageLi)

			//遍历出12345这些选项给ul添加页码
			$.each(result.extend.pageInfo.navigatepageNums, function(index,
					item) {

				var numLi = $("<li></li>").append($("<a></a>").append(item));
				//判断导航是否是当前页,如果是则不可选
				if (result.extend.pageInfo.pageNum == item) {
					numLi.addClass("active");
				}
				//给li绑定单击事件
				numLi.click(function() {
					to_page(item);
				});
				ul.append(numLi);
			});
			//添加下一页和末页的提示
			ul.append(nextPageLi).append(lastPageLi);

			var navEle = $("<nav></nav>").append(ul);
			navEle.appendTo("#page_nav_area");
		}

		function reset_form(ele){
			$(ele)[0].reset();
			//清空表单样式
			$(ele).find("*").removeClass("has-error has-success");
			$(ele).find(".help-block").text("");
		}
		
		//新增按钮事件绑定，弹出模态框（bootstrap）
		$("#emp_add_model_btn").click(function() {
			//清空表单数据(表单完整重置（表单数据及样式）)，不然会重叠
			reset_form("#empAddModel form");
			//发送ajax请求，查出部门信息，显示在下拉列表中
			getDepts("#dept_add_select");
			//弹出模态框
			$("#empAddModel").modal({
				backdrop : "static"
			});
		});
		
		
		//查出部门信息，显示在下拉列表中
		function getDepts(ele){
			//清空之前的下拉列表
			$(ele).empty();
			$.ajax({
				//处理请求，获取所有部门信息
				url:"${APP_PATH}/depts",
				type:"GET",
				success:function(result){
					//{"code":100,"msg":"处理成功！",
					//"extend":{"depts":[{"deptId":1,"deptName":"开发部"},{"deptId":2,"deptName":"测试部"}]}}
					//console.log(result);
					//显示部门信息在下拉列表中
					//$("#dept_add_select").append("")
					$.each(result.extend.depts,function(){
						
						
						var optionEle = $("<option></option>").append(this.deptName).attr("value",this.deptId);
    					optionEle.appendTo(ele);
					});
				}
			});
		}
		//校验表单数据
		function validate_add_form(){
			//1.拿到要校验的数据，使用正则表达式	.val(),获取值
			var empName = $("#empName_add_input").val();
			var regName = /(^[a-zA-Z0-9_-]{6,16}$)|(^[\u2E80-\u9FFF]{2,5})/;
			if(!regName.test(empName)){
				//alert("用户名可以是2-5位中文或6-16位英文和数字的组合");
				show_validate_msg("#empName_add_input","error","用户名可以是2-5位中文或6-16位英文和数字的组合");
				return false;
			}else{
				show_validate_msg("#empName_add_input","success","");
			}
			//2.校验邮箱信息
			var email = $("#email_add_input").val();
			var regEmail = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
			if(!regEmail.test(email)){
				//alert("邮箱格式不正确");
				show_validate_msg("#email_add_input","error","邮箱格式不正确");
				return false;
			}else{
				show_validate_msg("#email_add_input","success","");
			}
			return true;
		}
		
		//对检验结果是否成功创建集成方法,显示校验结果的提示信息
		function show_validate_msg(ele,status,msg){
			//应该清空这个元素之前的样式
			$(ele).parent().removeClass("has-success has-error");
			$(ele).next("span").text("");
			
			if("success"==status){
				$(ele).parent().addClass("has-success");
				$(ele).next("span").text(msg);
			}else{
				$(ele).parent().addClass("has-error");
				$(ele).next("span").text(msg);
			}
		}
		
		//校验用户名是否可用
		$("#empName_add_input").change(function(){
			//发送ajax请求校验用户名是否可用
			var empName = this.value;
			$.ajax({
				url:"${APP_PATH}/checkuser",
				data:"empName="+empName,
				type:"POST",
				success:function(result){
					if(result.code==100){
						show_validate_msg("#empName_add_input","success","用户名可用");
						$("#emp_save_btn").attr("ajax-va","success");
					}else{
						show_validate_msg("#empName_add_input","error",result.extend.va_msg);
						$("#emp_save_btn").attr("ajax-va","error");
					}
				}
			});
		});
		
		//点击保存，保存员工。
		$("#emp_save_btn").click(function(){
			//1.模态框中填写的表单数据提交给服务器进行保存
			//1.先对要提交给服务器的数据进行(前端)校验
			  if(!validate_add_form()){
				return false;
			}  
			//1.5判断之前的ajax用户名校验是否成功，如果成功
			if($(this).attr("ajax-va")=="error"){
				return false;
			}
			//2.发送ajax请求保存员工
			 $.ajax({
				url:"${APP_PATH}/emp",
				type:"POST",
				///serialize() 方法通过序列化表单值，创建 URL 编码文本字符串。$(selector).serialize()				
				data:$("#empAddModel form").serialize(),
				success:function(result){
					//alert(result.msg);
					if(result.code == 100){
						//员工保存成功
						//1.关闭模态框
						$("#empAddModel").modal('hide');
						//2.来到最后一页，显示刚才保存的数据
						//发送ajax请求显示最后一个数据既可
						//可以将总记录数
						to_page(totalRecord);
					}else{
						//显示失败信息
						console.log(result);
						//有那个字段的错误信息旧显示哪个字段的
						if(undefined!=result.extend.errorFields.email){
							//显示员工的邮箱错误信息
							show_validate_msg("#email_add_input","error",result.extend.errorFields.email);
						}
						if(undefined!=result.extend.errorFields.empName){
							//显示员工名字的错误信息
							show_validate_msg("#empName_add_input","error",result.extend.errorFields.empName);
						}
					}
					
					
				}
			});
		}); 
		
		
		//1.我们是按钮创建之前旧绑定了click，所以绑定不上
		//1）可以在创建按钮的时候绑定事件 2）绑定单击.live()
		//jquery新版没有live，使用on及逆行替代
		$(document).on("click",".edit_btn",function(){
			
			//1.查出部门信息，并显示部门列表
			getDepts("#empUpdateModel select");
			//2.查出员工信息，显示员工信息
			getEmp($(this).attr("edit-id"));
			
			//3.把员工的id传递给模态框的更新按钮
			$("#emp_update_btn").attr("edit-id",$(this).attr("edit-id"));
			$("#empUpdateModel").modal({
				backdrop : "static"
			});
		});
		
		function getEmp(id){
			$.ajax({
				url:"${APP_PATH}/emp/"+id,
				type:"GET",
				success:function(result){
					console.log(result);
					var empData = result.extend.emp;
					$("#empName_update_static").text(empData.empName);
					$("#email_update_input").val(empData.email);
					$("#empUpdateModel input[name=gender]").val([empData.gender]);
					$("#empUpdateModel select").val([empData.dId]);
				}
			});
		}
		
		//点击更新，更新员工信息
		$("#emp_update_btn").click(function(){
			//验证邮箱是否合法
			var email = $("#email_update_input").val();
			var regEmail = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
			if(!regEmail.test(email)){
				//alert("邮箱格式不正确");
				show_validate_msg("#email_update_input","error","邮箱格式不正确");
				return false;
			}else{
				show_validate_msg("#email_update_input","success","");
			}
			
			//2.发送ajax请求，保存更新的员工数据
			 $.ajax({
				url:"${APP_PATH}/emp/"+$(this).attr("edit-id"),
				type:"PUT",
				data:$("#empUpdateModel form").serialize(),
				success:function(result){
					//alert(result.msg);
					//1.关闭对话框
					$("#empUpdateModel").modal("hide");
					//2.回到本页面
					to_page(currentPage);
				}
			}); 
		});
		//单个删除
		$(document).on("click",".delete_btn",function(){
			//1.弹出是否确认删除对话框
			var empName = $(this).parents("tr").find("td:eq(3)").text();
			//this代表的是当前点击的按钮
			var empId = $(this).attr("del-id");
			//alert($(this).parents("tr").find("td:eq(1)").text());
			if(confirm("确认删除【"+empName+"】吗？")){
				//确认，发送ajax请求删除即可
				$.ajax({
					url:"${APP_PATH}/emp/"+empId,
					type:"DELETE",
					success:function(result){
						alert(result.msg);
						//回到本页
						to_page(currentPage);
					}
				});
			}
		});
		
		//完成全选/全不选
		$("#check_all").click(function(){
			//attr获取checked是undefine
			//我们这些dom原生的属性：attr获取自定义属性的值
			//prop修改和读取dom原生元素
			$(".check_item").prop("checked",$(this).prop("checked"));
		});
		
		//check_item,全选中单个的，上面的全选也跟着变化
		$(document).on("click",".check_item",function(){
			//判断当前选择中的元素是否是五个,jquery的checked
			var flag = $(".check_item:checked").length==$(".check_item").length
			$("#check_all").prop("checked",flag);
		})
		
		//点击全部删除，就批量删除
		$("#emp_delete_all_btn").click(function(){
			
			var empNames = " ";
			var del_idstr = ""; 
			$.each($(".check_item:checked"),function(){
				//this
				empNames+=$(this).parents("tr").find("td:eq(2)").text()+",";
				//组装员工id字符串
				del_idstr+=$(this).parents("tr").find("td:eq(1)").text()+"-";
			});
			//去除empNames多余的,
			empNames = empNames.substring(0,empNames.length-1);
			//去除员工id多余的-
			del_idstr = del_idstr.substring(0,del_idstr.length-1);
			if(confirm("确认删除【"+empNames+"】吗？")){
				//发送ajax请求删除删除员工
				$.ajax({
					url:"${APP_PATH}/emp/"+del_idstr,
					type:"DELETE",
					success:function(result){
						alert(result.msg);
						//回到当前页面
						to_page(currentPage);
					}
				});
			}
		});
		$("#emp_search_btn").click(function(){
			
		});
	</script>
</body>
</html>